package com.acceptable.qucun.file.mapper;

import com.acceptable.qucun.file.entity.template.TemplateFile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.lang.NonNull;

import java.util.List;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author 巴斯罗斯·K·赫斯洛利
 * @since 2021-08-29
 */
@Mapper
public interface TemplateFileMapper extends BaseMapper<TemplateFile> {
    void createTable(@NonNull @Param("userId") Integer userId);

    void dropTable(@NonNull @Param("userId") Integer userId);

    int insertInitInfo(@NonNull @Param("file") TemplateFile file);

    TemplateFile selectByFileId(@NonNull @Param("userId") Integer userId,
                                @NonNull @Param("fileId") Long fileId);

    List<TemplateFile> selectByShareId(@NonNull @Param("userId") Integer userId,
                                       @NonNull @Param("shareId") Integer shareId);

    List<TemplateFile> selectFileByShareStatus(@NonNull @Param("userId") Integer userId);

    // 根据file_id批量查询
    List<TemplateFile> selectBatchByFileId(@NonNull @Param("userId") Integer userId,
                                           @NonNull @Param("fileIdList") List<Long> fileIdList);

    TemplateFile selectUndeletedById(@NonNull @Param("userId") Integer userId,
                                     @NonNull @Param("fileId") Long fileId);

    int insert(@NonNull @Param("file") TemplateFile file);

    int insertBatch(@NonNull @Param("fileList") List<TemplateFile> fileList);

    List<TemplateFile> selectSubFile(@NonNull @Param("userId") Integer userId,
                                     @NonNull @Param("pid") Long pid);

    TemplateFile selectCurrentParentDict(@NonNull @Param("userId") Integer userId,
                                         @NonNull @Param("fileId") Long fileId);

    @Select("SELECT SUM(file_size) " +
            "FROM ${userId}_file " +
            "WHERE is_deleted = FALSE AND pid = #{pid}")
    long selectUsedVolume(@NonNull @Param("userId") Integer userId,
                          @NonNull @Param("pid") Long pid);

    int updateByFileId(@NonNull @Param("file") TemplateFile file);

    int updateBatchByFileId(@NonNull@Param("userId") Integer userId,
                            @NonNull @Param("fileList") List<TemplateFile> fileList);

    int logicalBatchDelete(@NonNull @Param("userId") Integer userId,
                           @NonNull @Param("dustbinDictId") Long dustbinDictId,
                           @NonNull @Param("fileIdList") List<Long> fileIdList);

    List<TemplateFile> selectSubDict(@NonNull @Param("userId") Integer userId,
                                     @NonNull @Param("pid") Long pid);

    @Select("SELECT COUNT(file_id) " +
            "FROM ${userId}_file " +
            "WHERE is_deleted=FALSE AND is_dict = TRUE AND pid=#{pid}")
    int countSubUndeletedDict(@NonNull @Param("userId") Integer userId,
                              @NonNull @Param("pid") Long pid);

    int deleteBatchByFileId(@NonNull @Param("userId") Integer userId,
                            @NonNull @Param("fileIdList") List<Long> fileIdList);

    List<TemplateFile> selectFileByMime(@NonNull @Param("userId") Integer userId,
                                        @NonNull @Param("mime") String mime);

    List<TemplateFile> selectAllDeletedFile(@NonNull @Param("userId") Integer userId,
                                            @NonNull @Param("dustbinDictId") Long dustbinDictId);
}
